/*
    rpc调用服务端测试：业务层与网络层联合测试
*/
#include "../../common/net.hpp"
#include "../../common/dispatcher.hpp"
#include "../../server/rpc_router.hpp"


void add(const Json::Value &params, Json::Value &result)
{
    result = params["num1"].asInt() + params["num2"].asInt();
}

int main()
{
    //SetDefaultLogLevel(Level::INFO); // 设置默认日志级别

    // 1.创建rpc路由器
    ns_jsonrpc::ns_server::RpcRouter::RpcRouterPtr rr = std::make_shared<ns_jsonrpc::ns_server::RpcRouter>();

    // 1.1 组织服务描述对象 && 注册服务（注册方法）
    ns_jsonrpc::ns_server::ServiceDescribeBuilder builder;
    builder.setMethodName("add");
    builder.setParamsDes("num1", ns_jsonrpc::ns_server::ParamType::INTEGRAL);
    builder.setParamsDes("num2", ns_jsonrpc::ns_server::ParamType::INTEGRAL);
    builder.setReturnType(ns_jsonrpc::ns_server::ParamType::INTEGRAL);
    builder.setCallback(add);
    ns_jsonrpc::ns_server::ServiceDescribe::ServiceDescribePtr serviceDes = builder.build();
    rr->registerMethod(serviceDes);

    // 2.创建调度器
    ns_jsonrpc::Dispatcher::DispatcherPtr dp = std::make_shared<ns_jsonrpc::Dispatcher>();

    // 2.1 注册消息回调（回调由上一层业务层RpcRouter提供）
    auto rpcReqCb = std::bind(&ns_jsonrpc::ns_server::RpcRouter::onRpcRequest, rr.get(), std::placeholders::_1, std::placeholders::_2);
    dp->registerCallback<ns_jsonrpc::RpcRequest>(ns_jsonrpc::MType::REQ_RPC, rpcReqCb);

    // 3.创建服务器
    ns_jsonrpc::BaseServer::BaseServerPtr sr = ns_jsonrpc::MuduoServerFactory::create(8888);

    // 3.1 注册消息回调（回调由上一层调度器Dispatcher提供）
    ns_jsonrpc::MessageCallback msgCb = std::bind(&ns_jsonrpc::Dispatcher::onMessage, dp.get(), std::placeholders::_1, std::placeholders::_2);
    sr->setMessageCallback(msgCb);

    // 4.启动服务器
    sr->start();
    return 0;
}